home *** CD-ROM | disk | FTP | other *** search
- #
- # This script parses a command_table file into something which is a bit
- # easier for an awk script to understand.
- #
- # Input syntax: a .ct file
- #
- # Output syntax:
- # (for the command_table line)
- # command_table <command_table>
- #
- #(for each request definition)
- # BOR
- # sub: <subroutine name>
- # hlp: <help text>
- # cmd: <command>
- # opt: <option>
- # EOR
- # (there may be more than one 'cmd' or 'opt' line
- #
- # A number sent to the output represents a parse error --- it will be
- # followed by the next line which will have the form:
- # ERROR: <error text>
- #
- # The design of this output syntax is such that it should be easy for
- # an awk script to parse.
-
- #
- # The first section of this script is just to cannoicalize the file.
- # It removes comments, and puts each command_table request onto a single
- # line
- #
- :FIRST
- y/ / /
- s/^ *//
- s/#.*$//
- /; *$/!{
- N
- y/ / /
- s/\n */ /
- bFIRST
- }
- s/, */, /g
- #
- # Now we take care of some syntatic sugar.....
- #
- /^unimplemented/ {
- s/^unimplemented [A-Za-z_0-9]*/request ss_unimplemented/
- s/;/, (dont_list, dont_summarize);/
- }
- /^unknown/ {
- s/^unknown /request ss_unknown, "", /
- }
- #
- # Dispatch based on the keyword.... illegal keywords are prefixed by ERROR:
- # and are handled by the awk script.
- #
- /^command_table /bCMD
- /^request /bREQUEST
- /^end;/bEND
- s/ .*//
- s/^/ERROR: unknown keyword: /
- =
- b
- #
- # Handle the command_table keyword
- #
- :CMD
- s/;$//
- p
- d
- b
- #
- # Handle the request keyword --- this is the heart of the sed script.
- #
- :REQUEST
- s/^request *//
- h
- i\
- BOR
- # First, parse out the subroutine name
- s/^/sub: /
- s/,.*//
- p
- # Next, parse out the help message, being careful to handle a quoted string
- g
- s/^[^,]*, *//
- h
- /^"/ {
- s/^"//
- s/".*//
- x
- s/^"[^"]*", *//
- x
- b EMITHLP
- }
- s/[^a-zA-Z0-9].*//
- x
- s/[a-zA-Z0-9]*, *//
- x
- :EMITHLP
- s/^/hlp: /
- p
- # Next take care of the command names
- :CMDLIST
- g
- /^(/b OPTIONS
- /^;/b EOR
- /^"/ {
- s/^"//
- s/".*//
- x
- s/^"[^"]*"//
- s/, *//
- x
- b EMITREQ
- }
- s/[^A-Za-z_0-9].*//
- x
- s/[A-Za-z_0-9]*//
- s/, *//
- x
- :EMITREQ
- s/^/cmd: /
- p
- b CMDLIST
- #
- # Here we parse the list of options.
- #
- : OPTIONS
- g
- s/^(//
- h
- : OPTLIST
- /^)/ b EOR
- /^[^A-Za-z_0-9]/ {
- =
- c\
- ERROR: parse error in options list
- }
- s/[^A-Za-z_0-9].*//
- x
- s/[A-Za-z_0-9]*//
- s/, *//
- x
- s/^/opt: /
- p
- g
- b OPTLIST
- : EOR
- c\
- EOR\
-
- d
- b
- #
- # Handle the end keyword --- it's basically ignored.
- #
- :END
- d
- b
-